package cn.topcodes.tcsf.admin.commons.convertor;

import org.springframework.beans.BeanUtils;
import org.springframework.util.Assert;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;

/**
 * Form->实体转换器
 * @author Unicorn
 * @date 2017/4/10
 */
public abstract class Form2EntityConvertor<T,F> extends Convertor<T> {

    /**
     * 转换列表数据
     * @param forms form列表
     * @return  实体列表
     */
    public List<T> convertList(List<F> forms) {
        Assert.notNull(forms);
        List<T> entitys = new ArrayList<T>();
        for(F form : forms) {
            entitys.add(convert(form));
        }
        return entitys;
    }

    /**
     * 转换对象
     * @param form  form对象
     * @return  实体对象
     */
    public T convert(F form) {
        Assert.notNull(form);
        try {
            T entity = this.getEntityClass().newInstance();
            BeanUtils.copyProperties(form,entity);
            diff(entity,form);
            return entity;
        } catch (Exception e) {
            throw new IllegalStateException("实体类型定义有误", e);
        }
    }

    /**
     * 仅处理不同的字段
     * @param entity    实体对象
     * @param form      form对象
     */
    public void diff(T entity, F form) {}

    /**
     * 获取Form的Class
     * @return Form的Class
     */
    public Class<F> getFormClass() {
        Class<F> formClass = (Class<F>) ((ParameterizedType) getClass().getGenericSuperclass())
                .getActualTypeArguments()[1];
        return formClass;
    }
}
